// 原始装饰
function testDecorator_05_01<T extends new (...args: any[]) => any>(
  constructor: T
) {
  return class extends constructor {
    // 先打印 1, 2 然后再执行这里的语法
    // 意思就是说在执行 new Test 之后，先执行原有构造函数内的 constructor 然后才执行这里面的扩展构造函数
    name = "lee";
    // 扩展 getName 方法
    getName() {
      return this.name;
    }
  };
}

// 使用方式：
@testDecorator_05_01
class Test {
  name: string;
  constructor(name: string) {
    console.log(1);
    this.name = name;
    console.log(2);
  }
}

const test = new Test("dell");
console.log(test);

// 工厂模式装饰
function testDecorator_05_01_2() {
  return function <T extends new (...args: any[]) => any>(constructor: T) {
    return class extends constructor {
      name = "lee";
      getName() {
        return this.name;
      }
    };
  };
}

// 使用方式：

const Test_05_01_1 = testDecorator_05_01_2()(
  class {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
  }
);

const test_05_01_2 = new Test_05_01_1("lyc");
console.log(test_05_01_2.getName());
